{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 卷积神经网络搭建\n",
    "    结构：\n",
    "    一层卷积\n",
    "    两层全连接网络\n",
    "    \n",
    "    卷积：\n",
    "    5x5 conv, filters=6\n",
    "    2x2 pool, strides=2\n",
    "    C（核：6*5*5，步长：1，填充：same ）\n",
    "    B（Yes）\n",
    "    A（relu）\n",
    "    P（max，核：2*2，步长：2，填充：same）\n",
    "    D（0.2）\n",
    "    \n",
    "    全连接层：\n",
    "    Dense 128\n",
    "    Dense 10\n",
    "    \n",
    "    Flatten\n",
    "    Dense（神经元：128，激活：relu，Dropout：0.2）\n",
    "    Dense（神经元：10，激活：softmax）\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 50000 samples, validate on 10000 samples\n",
      "Epoch 1/5\n",
      "50000/50000 [==============================] - 58s 1ms/sample - loss: 1.6767 - sparse_categorical_accuracy: 0.3910 - val_loss: 1.4354 - val_sparse_categorical_accuracy: 0.4852\n",
      "Epoch 2/5\n",
      "50000/50000 [==============================] - 58s 1ms/sample - loss: 1.4630 - sparse_categorical_accuracy: 0.4708 - val_loss: 1.3987 - val_sparse_categorical_accuracy: 0.4871\n",
      "Epoch 3/5\n",
      "50000/50000 [==============================] - 59s 1ms/sample - loss: 1.3890 - sparse_categorical_accuracy: 0.5007 - val_loss: 1.2976 - val_sparse_categorical_accuracy: 0.5282\n",
      "Epoch 4/5\n",
      "50000/50000 [==============================] - 67s 1ms/sample - loss: 1.3276 - sparse_categorical_accuracy: 0.5239 - val_loss: 1.2388 - val_sparse_categorical_accuracy: 0.5635\n",
      "Epoch 5/5\n",
      "50000/50000 [==============================] - 76s 2ms/sample - loss: 1.2939 - sparse_categorical_accuracy: 0.5355 - val_loss: 1.1922 - val_sparse_categorical_accuracy: 0.5818\n",
      "Model: \"baseline\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              multiple                  456       \n",
      "_________________________________________________________________\n",
      "batch_normalization (BatchNo multiple                  24        \n",
      "_________________________________________________________________\n",
      "activation (Activation)      multiple                  0         \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) multiple                  0         \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            multiple                  0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            multiple                  0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                multiple                  196736    \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          multiple                  0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              multiple                  1290      \n",
      "=================================================================\n",
      "Total params: 198,506\n",
      "Trainable params: 198,494\n",
      "Non-trainable params: 12\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import os\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense\n",
    "from tensorflow.keras import Model\n",
    "\n",
    "np.set_printoptions(threshold=np.inf)\n",
    "\n",
    "cifar10 = tf.keras.datasets.cifar10\n",
    "(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n",
    "x_train, x_test = x_train / 255.0, x_test / 255.0\n",
    "\n",
    "##################网络结构##################\n",
    "class Baseline(Model):\n",
    "    def __init__(self):\n",
    "        super(Baseline, self).__init__()\n",
    "        self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same')  # 卷积层\n",
    "        self.b1 = BatchNormalization()  # BN层\n",
    "        self.a1 = Activation('relu')  # 激活层\n",
    "        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same')  # 池化层\n",
    "        self.d1 = Dropout(0.2)  # dropout层\n",
    "\n",
    "        self.flatten = Flatten()\n",
    "        self.f1 = Dense(128, activation='relu')\n",
    "        self.d2 = Dropout(0.2)\n",
    "        self.f2 = Dense(10, activation='softmax')\n",
    "\n",
    "    def call(self, x):\n",
    "        x = self.c1(x)\n",
    "        x = self.b1(x)\n",
    "        x = self.a1(x)\n",
    "        x = self.p1(x)\n",
    "        x = self.d1(x)\n",
    "\n",
    "        x = self.flatten(x)\n",
    "        x = self.f1(x)\n",
    "        x = self.d2(x)\n",
    "        y = self.f2(x)\n",
    "        return y\n",
    "##########################################\n",
    "\n",
    "model = Baseline()\n",
    "\n",
    "#compile配置训练方法\n",
    "model.compile(optimizer='adam',#优化器Adam\n",
    "              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),#损失函数from_logits=False  f2 = Dense(10, activation='softmax')\n",
    "              metrics=['sparse_categorical_accuracy'])#评测指标\n",
    "\n",
    "checkpoint_save_path = \"./checkpoint/Baseline.ckpt\"\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "    model.load_weights(checkpoint_save_path)\n",
    "\n",
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True)\n",
    "#fit执行训练过程\n",
    "history = model.fit(x_train, y_train, \n",
    "                    batch_size=32,\n",
    "                    epochs=5, \n",
    "                    validation_data=(x_test, y_test), \n",
    "                    validation_freq=1,#多少次数据集迭代用测试集验证准确率\n",
    "                    callbacks=[cp_callback])#使用回调函数实现断点续训\n",
    "model.summary()\n",
    "\n",
    "# print(model.trainable_variables)\n",
    "file = open('./weights.txt', 'w')\n",
    "for v in model.trainable_variables:\n",
    "    file.write(str(v.name) + '\\n')\n",
    "    file.write(str(v.shape) + '\\n')\n",
    "    file.write(str(v.numpy()) + '\\n')\n",
    "file.close()\n",
    "\n",
    "###############################################    show   ###############################################\n",
    "\n",
    "# 显示训练集和验证集的acc和loss曲线\n",
    "acc = history.history['sparse_categorical_accuracy']\n",
    "val_acc = history.history['val_sparse_categorical_accuracy']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.plot(acc, label='Training Accuracy')\n",
    "plt.plot(val_acc, label='Validation Accuracy')\n",
    "plt.title('Training and Validation Accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(loss, label='Training Loss')\n",
    "plt.plot(val_loss, label='Validation Loss')\n",
    "plt.title('Training and Validation Loss')\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
